package models;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Observable;
import java.util.Observer;
import controller.Serializer;
public class Bank implements BankProc,Observer,Serializable{
/**
*
*/
private static final long serialVersionUID = 577739697471859697L;
private static double minStartSum=10;
private static double comission=0.3;
private static double increaseSum=1;
private static double accountsNoLimit=5;
private String report;
private HashMap<Person,ArrayList<Account>> bankData ;
public Bank(){
bankData=new HashMap<>();
}
@Override
public void addPerson(Person person) {
assert (person!=null);
assert (person.getAge()>18);
assert (isWellFormed());
int sizeBefore=bankData.size();
if (person.getAge()>18){
bankData.put(person, new ArrayList<Account>());
report=report+person.getName()+" was added to bank.\n";
}
else{
report=report+person.getName()+"Minors cannot hold accounts\n";
}
int sizeAfter=bankData.size();
assert (sizeAfter==sizeBefore+1);
assert (isWellFormed());
// TODO Auto-generated method stub
}
@Override
public void removePerson(Person person) {
assert (person!=null);
assert (bankData.containsKey(person));
assert (isWellFormed());
int sizeBefore=bankData.size();
if (bankData.containsKey(person)){
bankData.remove(person);
report=report+person.getName()+" was removed from bank.\n ";
}
else{
report=report+person.getName()+" person is not a client\n";
}
int sizeAfter=bankData.size();
assert (sizeAfter==sizeBefore-1);
assert (isWellFormed());
// TODO Auto-generated method stub
}
@Override
public void addHolderAccount(Person holder, Account account) {
assert (holder!=null);
assert (account!=null);
assert (isWellFormed());
int sizeBefore=holder.getNumberOfAccounts();
if (bankData.containsKey(holder)){
if (bankData.get(holder).size()==accountsNoLimit)
report=report+holder.getName()+" has reached max no of accounts.\n";
else{
if (account.sumIsInsufficient()) {
report=report+holder.getName()+"the start deposit sum is insufficient.\n";
return;
}
else{
bankData.get(holder).add(account);
account.addObserver(this);
holder.setNumberOfAccounts(holder.getNumberOfAccounts()+1);
report=report+account.getAccountID()+" was created.\n";
}
}
}
else report=report+holder.getName()+" person is not a client\n";
// TODO Auto-generated method stub
int sizeAfter=holder.getNumberOfAccounts();
assert (sizeAfter==sizeBefore+1);
assert (isWellFormed());
}
@Override
public void removeHolderAccount(Person holder, Account account) {
assert (holder!=null);
assert (account!=null);
assert (isWellFormed());
int sizeBefore=holder.getNumberOfAccounts();
if (bankData.containsKey(holder)){
int index=0;
int indexOfAccount=-1;
boolean foundAccount=false;
for (Account a:bankData.get(holder)){
if (account.equals(a)){
indexOfAccount=index;
foundAccount=true;
}
index++;
}
if (foundAccount==false) report=report+holder.getName()+" owning account not found\n";
else{
bankData.get(holder).remove(indexOfAccount);
holder.setNumberOfAccounts(holder.getNumberOfAccounts()-1);
report=report+account.getAccountID()+" was removed from accounts.\n ";
}
}
else report=report+holder.getName()+" person is not a client\n";
int sizeAfter=holder.getNumberOfAccounts();
assert (sizeAfter==sizeBefore-1);
assert (isWellFormed());
}
@Override
public void generateReport() {
// TODO Auto-generated method stub
}
@Override
public void update(Observable o, Object arg) {
report = report + "\n" + "An operation has been done on account: " + ((Account) o).getAccountID()
+ ", now the amout of money is: " + ((Account) o).getAccountSum();
}
public static double getMinStartSum() {
// TODO Auto-generated method stub
return minStartSum;
}
public static double getComission() {
return comission;
}
public static double getIncreaseSum() {
// TODO Auto-generated method stub
return increaseSum;
}
public String getReport(){
return report;
}
public HashMap<Person,ArrayList<Account>> getBankData(){
return bankData;
}
public boolean isWellFormed(){
for (Person person:bankData.keySet()){
if (person.getName()==null) return false;
if (person.getOccupation()==null) return false;
if (person.getAge()<18) return false;
for (Account acc:bankData.get(person)){
if (acc==null) return false;
if (acc.getType()=="Saving")
if (acc.getAccountSum()<10)
return false;
if (acc.getType()=="Spending")
if (acc.getAccountSum()<0)
return false;
if (acc.getcreationDate().after(acc.getValidUntilDate())) return false;
if (acc.getcreationDate().equals(acc.getValidUntilDate())) return false;
}
}
return true;
}
}